package simpleGa;

import java.util.Random;

public class GA {

    public static Graf mainGraf;
    private Populacja populacja;
    private Wspinaczka wspinaczka;

    public static void main(String[] args) {
        GA ga = new GA();
        ga.start();
    }

    private void start() {
        mainGraf = new Graf();
        mainGraf.createGlownyGraf();
//        mainGraf.wypiszGraf();
        obliczAlgorytmemGenetycznym();
        System.out.println("--------------------------------------------------------------");
        obliczAlgorytmemWpinaczkowym();

    }

    private void obliczAlgorytmemWpinaczkowym() {

        wspinaczka = new Wspinaczka();

        Osobnik sciezka1 = wspinaczka.getListOsobnikow().get(0);
        Osobnik sciezka2 = wspinaczka.getListOsobnikow().get(0);

        Osobnik[] temp = new Osobnik[6];
        Osobnik temp1;

        for (int i = 1; i < wspinaczka.getListOsobnikow().size();) {

            temp[0] = wspinaczka.getListOsobnikow().get(i++);
            temp[1] = wspinaczka.getListOsobnikow().get(i++);
            temp[2] = wspinaczka.getListOsobnikow().get(i++);
            temp[3] = wspinaczka.getListOsobnikow().get(i++);
            temp[4] = wspinaczka.getListOsobnikow().get(i++);
            temp[5] = wspinaczka.getListOsobnikow().get(i++);
            temp1 = sciezka1;
            for (int o = 0; o < 6; o++) {
                if (temp[o].getOcena() < temp1.getOcena()) {
                    temp1 = temp[o];
                }
            }
            if (temp1.getOcena() < sciezka1.getOcena()) {
                sciezka1 = temp1;
            }
            temp1 = sciezka2;
            for (int o = 0; o < 6; o++) {
                if (temp[o].getOcena() < temp1.getOcena()
                        && temp1.getOcena() < sciezka1.getOcena()) {
                    temp1 = temp[o];
                }
            }
            if (temp1.getOcena() < sciezka2.getOcena()) {
                sciezka2 = temp1;
            }
//            System.out.println("sciezka1 " + sciezka1.getOcena() + " sciezka2 " + sciezka2.getOcena());
            System.out.println(sciezka1.getOcena());
            if (i > wspinaczka.getListOsobnikow().size() - 7) {
                break;
            }
        }

    }

    private void obliczAlgorytmemGenetycznym() {
        populacja = new Populacja();
//        populacja.wyswietlOceny();
        Osobnik najlepszy = populacja.getNajlepszy();
//        System.out.println("Najlepszy osobnik to " + najlepszy.getId() + " z oceną " + najlepszy.getOcena());

        for (int o = 0; o < 5000; o++) {
            populacja.krzyzowanie(najlepszy);
            populacja.mutuj(najlepszy, 10);
            najlepszy = populacja.getNajlepszy();
//            System.out.println("Najlepszy w pokoleniu " + o + " ma ocenę " + najlepszy.getOcena());
            System.out.println(najlepszy.getOcena());
        }

    }

    public static int losujLiczbe(int i) {
        Random randomGenerator = new Random();
        return randomGenerator.nextInt(i + 1);
    }

}
